package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup

func main() {
	// 声明类型
	ch1 := make(chan int, 2)
	//  // 一直等带消费通道中的数据，但是并没有生产者往通道内添加数据 死锁
	// <-ch1 // fatal error: all goroutines are asleep - deadlock!

	// ch1 <- 10
	// ch1 <- 20
	// // 通道已经被装满，并且没有消费者 导致死锁
	// ch1 <- 13 // fatal error: all goroutines are asleep - deadlock!
	/* wg.Add(2)
	go func() { // 生产者
		defer wg.Done()
		for i := 0; i < 10; i++ {
			ch1 <- i
			// 通道满了，该进程会挂起 等待消费
			fmt.Println("ch1 IN:", i)
		}
	}()

	go func() { // 消费者
		defer wg.Done()
		for i := 0; i < 10; i++ {
			// 通道空了，该进程会挂起 等待生产
			fmt.Println("ch1 OUT:", <-ch1)
		}
	}()
	wg.Wait() */

	// 关闭通道
	ch1 <- 1
	close(ch1)
	fmt.Println(<-ch1)
	// 通道关闭后，通道可以读，不可写
	// ch1 <- 2           // panic: send on closed channel
	fmt.Println(<-ch1) // 关闭通道后，读取为空的通道不会再挂起线程
	res, ok := <-ch1
	fmt.Println(res, ok) // 0 false

}
